﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

//int mian()
//{
//	int arr[10] = { 0 };
//	int arr2[] = { 0 };
//	int arr3[20] = { 1,2,3,4,5,6,7,8,9,0 };
//
//	return 0;
//}

//一维数组的每个元素是int类型
//二维数组是一维数组的数组
//int main()
//{
//	int data1[3][5] = { 1,2,3,4,5,6,7,8 };//不完全初始化
//	int data2[3][5] = { 0 };//不完全初始化
//	int data3[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };//不完全初始化
//	int data4[3][5] = { {1,2} ,{ 3,4 },{5,6} };
//
//	int data5[][5] = { 1,2,3,4 };
//	int data6[][5] = { { 1,2 } ,{ 3,4 },{ 5,6,7,8 } };
//
//	return 0;
//}



//⼆维数组的使⽤
//⼆维数组的下标
//其实⼆维数组访问也是使⽤下标的形式的，⼆维数组是有⾏和列的，只要锁定了⾏和列就能唯⼀锁定数组中的⼀个元素。
//C语⾔规定，⼆维数组的⾏是从0开始的，列也是从0开始的

//int main()
//{
//	/*int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
//	printf("%d\n", arr[1][2]);*/
//
//
//	int arr[3][5] = { 0 };
//	
//
//	//输入
//	int i = 0;
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			scanf("%d", &arr[i][j]);
//		}
//	}
//
//	//输出
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//	}
//
//	return 0;
//}


//int main()
//{
//	int arr[3][5] = { 0 };
//
//	//输入
//	int i = 0;
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			scanf("%d", &arr[i][j]);
//			printf("%d ", arr[i][j]);
//		}
//	}
//
//	return 0;
//}


//二维数组在内存中的存储
//二维数组在内存中也是连续存放的
//int main()
//{
//	int arr[3][5] = { 0 };
//	int i = 0;
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
//		}
//	}
//
//	return 0;
//}


//int main()
//{
//	int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 3; j++)
//		{
//			printf("%d ", arr[j][i]);
//		}
//	}
//
//	return 0;
//}


//在C99标准之前，数组在创建的时候，数组大小的制定，只能使用常量
//在C99之后，C语言引入了变长数组的概念
//C99中给⼀个变⻓数组（variable - lengtharray，简称VLA）的新特性，允许我们可以使⽤变量指定数组⼤⼩
//VS2022是不支持变长数组的
//DevC++ / 小熊猫C++ 底层使用gcc，gcc支持C99中的变长数组的
//变⻓数组的根本特征，就是数组⻓度只有运⾏时才能确定，所以变⻓数组不能初始化。
//它的好处是程序员不必在开发时，随意为数组指定⼀个估计的⻓度，程序可以在运⾏时为数组分配精确的⻓度。
//有⼀个⽐较迷惑的点，变⻓数组的意思是数组的⼤⼩是可以使⽤变量来指定的，
//在程序运⾏的时候，根据变量的⼤⼩来指定数组的元素个数，⽽不是说数组的⼤⼩是可变的。
//数组的⼤⼩⼀旦确定就不能再变化了。
//遗憾的是在VS2022上，虽然⽀持⼤部分C99的语法，没有⽀持C99中的变⻓数组，没法测试
//int main()
//{
//	/*int arr1[10] = { 0 };
//	int n = 10;
//	int arr2[n];*/
//
//	/*int n = 0;
//	scanf("%d", &n);
//	int arr[n];*/
//
//	return 0;
//}



//练习1：多个字符从两端移动，向中间汇聚
//stelen：求字符串长度
//#include <string.h>  //strlen
//#include <windows.h>  //Sleep
//#include <stdlib.h>  //system
//int main()
//{
//	char arr1[] = "hello bit!!!!!!!!!";
//	char arr2[] = "##################";
//
//	int left = 0;
//	int right = strlen(arr1) - 1;
//
//	while(left <= right)
//	{
//		arr2[left] = arr1[left];
//		arr2[right] = arr1[right];
//		printf("%s\n", arr2);
//		Sleep(1000);//休眠1000毫秒
//		system("cls");//清理控制台屏幕信息
//		left++;
//		right--;
//	}
//	printf("%s\n", arr1);
//
//	return 0;
//}



//练习2：⼆分查找（折半查找）
//在⼀个升序的数组中查找指定的数字n，很容易想到的⽅法就是遍历数组，但是这种⽅法效率⽐较低。
//⽐如我买了⼀双鞋，你好奇问我多少钱，我说不超过300元。你还是好奇，你想知道到底多少，我就让你猜，你会怎么猜？
//你会1，2，3，4...这样猜吗？显然很慢；⼀般你都会猜中间数字
//⽐如：150，然后看⼤了还是⼩了，这就是⼆分查找，也叫折半查找
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int k = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	//输入要查找的值，假设是7
//	scanf("%d", &k);
//
//	int left = 0;
//	int right = sz - 1;
//	int flag = 0;//找不到
//
//	while (left <= right)
//	{
//		//int mid = (left + right) / 2;
//       int mid = left + (right - left) / 2;
// 
//		if (arr[mid] < k)
//		{
//			left = mid + 1;
//		}
//		else if (arr[mid] > k)
//		{
//			right = mid - 1;
//		}
//		else
//		{
//			printf("找到了，下标是%d\n", mid);
//			flag = 1;
//			break;
//		}
//	}
//	if (flag == 0)
//	{
//		printf("找不到\n");
//	}
//
//	return 0;
//}




//函数
// 库函数和自定义函数
//其实在C语言也引入函数（function）的概念，有些翻译为：子程序，子程序这种翻译更加准确⼀些。
//C语言中的函数就是⼀个完成某项特定的任务的⼀小段代码

//C语言标准中规定了C语言的各种语法规则，C语言并不提供库函数；C语言的国际标准ANSI C规定了⼀些常用的函数的标准，被称为标准库
//那不同的编译器厂商根据ANSI提供的C语言标准就给出了⼀系列函数的实现。这些函数就被称为库函数。
//我们前面内容中学到的 printf 、 scanf 都是库函数，库函数也是函数，不过这些函数已经是现成的，我们只要学会就能直接使用了。
//有了库函数，⼀些常见的功能就不需要程序员自己实现了，⼀定程度提升了效率；同时库函数的质量和执行效率上都更有保证。

//头文件：库函数是在标准库中对应的头文件中声明的，所以库函数的使⽤，务必包含对应的头⽂件，不包含是可能会出现⼀些问题的

#include <math.h>
int main()
{
	double r = sqrt(16);
	printf("%lf\n", r);

	return 0;
}